trying URL 'http://cran.us.r-project.org/bin/macosx/contrib/4.0/maps_3.3.0.tgz'
Content type 'application/x-gzip' length 3687860 bytes (3.5 MB)
==================================================
downloaded 3.5 MB

The downloaded binary packages are in
    /var/folders/gs/080wb67j58df5y8ccjf53yw00000gn/T//Rtmp9OH1LM/downloaded_packages
trying URL 'http://cran.us.r-project.org/bin/macosx/contrib/4.0/tmap_3.3-1.tgz'
Content type 'application/x-gzip' length 3585561 bytes (3.4 MB)
==================================================
downloaded 3.4 MB

The downloaded binary packages are in
    /var/folders/gs/080wb67j58df5y8ccjf53yw00000gn/T//Rtmp9OH1LM/downloaded_packages
trying URL 'http://cran.us.r-project.org/bin/macosx/contrib/4.0/rgeos_0.5-5.tgz'
Content type 'application/x-gzip' length 8537441 bytes (8.1 MB)
==================================================
downloaded 8.1 MB

The downloaded binary packages are in
    /var/folders/gs/080wb67j58df5y8ccjf53yw00000gn/T//Rtmp9OH1LM/downloaded_packages
library(educationdata)
# Test Run with using get_education_data 
# data <- get_education_data(level = "college-university",
#     source = "ipeds",
#     topic = "directory",
#     filters = list(year = 2019))
# data

# Scorecard data - 2019 
sc <- read_csv('2019_College_Scorecard_Valid_Admissions_Data.csv')
sc

## change projection of sc data
sc <- sc %>%
  dplyr::mutate(uni_rank = case_when(
    ADM_RATE < 0.05 ~ 'elite',
    ADM_RATE < 0.2 ~ 'highly selective',
    ADM_RATE < 0.3 ~ 'more selective',
    ADM_RATE < 0.5 ~ 'selective',
    ADM_RATE < 0.7 ~ 'less selective',
    TRUE ~ 'not selective')) %>% mutate(uni_rank = factor(uni_rank, levels=c('not selective', 'less selective', 'selective', 'more selective', 'highly selective', 'elite')))

Simple Scattergram

First we are going to try to present this pattern for different tiers of universities (admission rate as well as debt)

# Remove PrivacySuppressed Records and transform Debt Median into a numeric value - we can also do this on the main sc df
sc$DEBT_MDN[is.na(sc$DEBT_MDN)] <- 0;

m <- sc %>% subset(DEBT_MDN !='PrivacySuppressed') %>% transform(DEBT_MDN = as.numeric(DEBT_MDN)) %>% 
              ggplot(., aes(x=ADM_RATE, y=DEBT_MDN,color=uni_rank)) +
  geom_point() +
  geom_smooth(color='#EA4F88', se = FALSE) +
  theme_ipsum(base_size = 10, axis_title_size = 12, plot_title_size=14) +
  scale_color_viridis_d()+
  theme(
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank()) +
  scale_y_discrete(limits=c(0,10000,20000,30000), labels=c('0','10','20','30')) +
  labs(x='Admissions Rate', y='Median Loan Amount per Student\n(thousands)', 
       title='Student Debt and Admissions Rate',
       color='Selectivity')
Continuous limits supplied to discrete scale.
Did you mean `limits = factor(...)` or `scale_*_continuous()`?
m

Scattergram as Violin Plot

ipeds15 <- get_education_data(level = "college-university",
    source = "ipeds",
    topic = "grad-rates-pell",
    filters = list(year = 2015))
ipeds15

Student Debt over Time

#Process the data 
sc_time <- read_csv('2010_2019_student_debt.csv') 
Missing column names filled in: 'X1' [1]
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  INSTNM = col_character(),
  CITY = col_character(),
  STABBR = col_character(),
  ZIP = col_character(),
  UNEMP_RATE = col_logical(),
  DEBT_MDN = col_character(),
  MN_EARN_WNE_P10 = col_logical(),
  MD_EARN_WNE_P10 = col_logical(),
  School = col_logical(),
  State = col_logical(),
  True = col_character(),
  ADM_RATE_ALL_1 = col_character()
)
ℹ Use `spec()` for the full column specifications.

28660 parsing failures.
 row    col           expected                  actual                         file
3223 UNITID a double           Community College       '2010_2019_student_debt.csv'
3223 School 1/0/T/F/TRUE/FALSE Kenai Peninsula College '2010_2019_student_debt.csv'
3223 State  1/0/T/F/TRUE/FALSE Alaska                  '2010_2019_student_debt.csv'
3224 UNITID a double           Community College       '2010_2019_student_debt.csv'
3224 School 1/0/T/F/TRUE/FALSE Kodiak College          '2010_2019_student_debt.csv'
.... ...... .................. ....................... ............................
See problems(...) for more details.
sc_time<- sc_time %>% subset(DEBT_MDN !='PrivacySuppressed') %>% 
  transform(DEBT_MDN = as.numeric(DEBT_MDN)) %>% 
  dplyr::mutate(DEBT_MDN = ifelse(is.na(DEBT_MDN), 0, DEBT_MDN))
# Additions of States df from Tigris File 
library(tigris)
To enable 
caching of data, set `options(tigris_use_cache = TRUE)` in your R script or .Rprofile.
states <- states(cb = TRUE)

  |                                                                                                                            
  |                                                                                                                      |   0%
  |                                                                                                                            
  |=                                                                                                                     |   1%
  |                                                                                                                            
  |==                                                                                                                    |   1%
  |                                                                                                                            
  |==                                                                                                                    |   2%
  |                                                                                                                            
  |===                                                                                                                   |   2%
  |                                                                                                                            
  |===                                                                                                                   |   3%
  |                                                                                                                            
  |====                                                                                                                  |   3%
  |                                                                                                                            
  |====                                                                                                                  |   4%
  |                                                                                                                            
  |=====                                                                                                                 |   4%
  |                                                                                                                            
  |======                                                                                                                |   5%
  |                                                                                                                            
  |=======                                                                                                               |   6%
  |                                                                                                                            
  |========                                                                                                              |   7%
  |                                                                                                                            
  |=========                                                                                                             |   8%
  |                                                                                                                            
  |==========                                                                                                            |   8%
  |                                                                                                                            
  |==========                                                                                                            |   9%
  |                                                                                                                            
  |===========                                                                                                           |   9%
  |                                                                                                                            
  |===========                                                                                                           |  10%
  |                                                                                                                            
  |============                                                                                                          |  10%
  |                                                                                                                            
  |=============                                                                                                         |  11%
  |                                                                                                                            
  |==============                                                                                                        |  12%
  |                                                                                                                            
  |===============                                                                                                       |  13%
  |                                                                                                                            
  |================                                                                                                      |  14%
  |                                                                                                                            
  |=================                                                                                                     |  14%
  |                                                                                                                            
  |=================                                                                                                     |  15%
  |                                                                                                                            
  |===================                                                                                                   |  16%
  |                                                                                                                            
  |====================                                                                                                  |  17%
  |                                                                                                                            
  |=====================                                                                                                 |  17%
  |                                                                                                                            
  |=====================                                                                                                 |  18%
  |                                                                                                                            
  |======================                                                                                                |  18%
  |                                                                                                                            
  |======================                                                                                                |  19%
  |                                                                                                                            
  |=======================                                                                                               |  19%
  |                                                                                                                            
  |=========================                                                                                             |  21%
  |                                                                                                                            
  |===========================                                                                                           |  22%
  |                                                                                                                            
  |============================                                                                                          |  23%
  |                                                                                                                            
  |=============================                                                                                         |  24%
  |                                                                                                                            
  |===============================                                                                                       |  26%
  |                                                                                                                            
  |===============================                                                                                       |  27%
  |                                                                                                                            
  |=================================                                                                                     |  28%
  |                                                                                                                            
  |==================================                                                                                    |  29%
  |                                                                                                                            
  |=====================================                                                                                 |  31%
  |                                                                                                                            
  |======================================                                                                                |  32%
  |                                                                                                                            
  |=======================================                                                                               |  33%
  |                                                                                                                            
  |=========================================                                                                             |  34%
  |                                                                                                                            
  |=========================================                                                                             |  35%
  |                                                                                                                            
  |===========================================                                                                           |  36%
  |                                                                                                                            
  |=============================================                                                                         |  38%
  |                                                                                                                            
  |=================================================                                                                     |  42%
  |                                                                                                                            
  |==================================================                                                                    |  43%
  |                                                                                                                            
  |=======================================================                                                               |  46%
  |                                                                                                                            
  |=======================================================                                                               |  47%
  |                                                                                                                            
  |========================================================                                                              |  48%
  |                                                                                                                            
  |===========================================================                                                           |  50%
  |                                                                                                                            
  |============================================================                                                          |  51%
  |                                                                                                                            
  |==============================================================                                                        |  53%
  |                                                                                                                            
  |===============================================================                                                       |  53%
  |                                                                                                                            
  |================================================================                                                      |  55%
  |                                                                                                                            
  |==================================================================                                                    |  56%
  |                                                                                                                            
  |====================================================================                                                  |  58%
  |                                                                                                                            
  |======================================================================                                                |  59%
  |                                                                                                                            
  |========================================================================                                              |  61%
  |                                                                                                                            
  |==========================================================================                                            |  63%
  |                                                                                                                            
  |===========================================================================                                           |  64%
  |                                                                                                                            
  |============================================================================                                          |  65%
  |                                                                                                                            
  |==============================================================================                                        |  66%
  |                                                                                                                            
  |================================================================================                                      |  68%
  |                                                                                                                            
  |==================================================================================                                    |  69%
  |                                                                                                                            
  |====================================================================================                                  |  71%
  |                                                                                                                            
  |=========================================================================================                             |  76%
  |                                                                                                                            
  |=============================================================================================                         |  79%
  |                                                                                                                            
  |===================================================================================================                   |  84%
  |                                                                                                                            
  |======================================================================================================                |  87%
  |                                                                                                                            
  |=======================================================================================================               |  87%
  |                                                                                                                            
  |========================================================================================================              |  88%
  |                                                                                                                            
  |==========================================================================================================            |  89%
  |                                                                                                                            
  |=============================================================================================================         |  92%
  |                                                                                                                            
  |==============================================================================================================        |  93%
  |                                                                                                                            
  |================================================================================================================      |  95%
  |                                                                                                                            
  |==================================================================================================================    |  96%
  |                                                                                                                            
  |===================================================================================================================== |  99%
  |                                                                                                                            
  |======================================================================================================================| 100%
sc_time
sc_time_year <- sc_time %>% group_by()

# States 
states_10 <- states %>% 
  inner_join(sc_time, by=c(STUSPS='STABBR')) 


popup1 <- paste("State:",states$NAME,"<br/>",
                 "Population:",states$population,"<br/>",
                 "Successful Projects / Population:",states$scaled_success,"<br/>")

#used 'success' measures. 
m <- leaflet(states) %>% addProviderTiles("CartoDB.Positron") %>%
  addPolygons(fillColor = ~pal(states$scaled_success),
              color = "white",
              weight = 0.5,
              fillOpacity = 0.7,  
              highlight = highlightOptions(
                weight = 5,
                color = "#666",
                fillOpacity = 0.7,
                bringToFront = TRUE),
                popup=popup1) %>%
  addLegend(position = "bottomleft",pal = pal, values = c(min(states$scaled_success),max(states$scaled_success)),title = "Successful Kickstarter Projects\n (scaled by state)") %>% 
  setView(-98.5795, 39.8282, zoom=3)
Error in setView(., -98.5795, 39.8282, zoom = 3) : 
  could not find function "setView"
LS0tCnRpdGxlOiAiVmlzdWFsc19EcmFmdF8wNF8xNCIKYXV0aG9yOiAiQ29ubmllIFh1IgpkYXRlOiAiNC8xNC8yMDIxIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCmBgYHtyIHBhY2thZ2VzLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnIgPSBnZXRPcHRpb24oInJlcG9zIikKclsiQ1JBTiJdID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciCm9wdGlvbnMocmVwb3MgPSByKQojIGluc3RhbGwucGFja2FnZXMgKGJhc2ljKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoZHBseXIpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkodGlkeXZlcnNlKSkKCiMgaW5zdGFsbC5wYWNrYWdlcyAocmVhZGluZykKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KFhNTCkpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShSQ3VybCkpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShyZWFkcikpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeSgicmVhZHhsIikpCgojIGluc3RhbGwucGFja2FnZXMgKHRoZW1lcykKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGdndGhlbWVzKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGdncmVwZWwpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoUkNvbG9yQnJld2VyKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KHZpcmlkaXMpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoaHJicnRoZW1lcykpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShwbG90bHkpKQoKCiMgaW5zdGFsbC5wYWNrYWdlcyAobWFwcykKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KFJnb29nbGVNYXBzKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGdnbWFwKSkKc3VwcHJlc3NNZXNzYWdlcyhpbnN0YWxsLnBhY2thZ2VzKCJtYXBzIikpCnN1cHByZXNzTWVzc2FnZXMoaW5zdGFsbC5wYWNrYWdlcygidG1hcCIpKSAjIGluc3RhbGwgdGhlIENSQU4gdmVyc2lvbgpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkodG1hcCkpCnN1cHByZXNzTWVzc2FnZXMoaW5zdGFsbC5wYWNrYWdlcygncmdlb3MnKSkKCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShkZXZ0b29scykpCiMgTGV0J3MgaW5zdGFsbCB0aGUgZGV2ZWxvcG1lbnQgdmVyc2lvbiBmcm9tIEdpdGh1Yi4gUnVuCnN1cHByZXNzTWVzc2FnZXMoZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyc3R1ZGlvL2xlYWZsZXQiKSkKYGBgCgpgYGB7ciBpbXBvcnQgZ2VuZXJhbCBkYXRhLCBlY2hvPVRSVUUsIGV2YWw9VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShlZHVjYXRpb25kYXRhKQojIFRlc3QgUnVuIHdpdGggdXNpbmcgZ2V0X2VkdWNhdGlvbl9kYXRhIAojIGRhdGEgPC0gZ2V0X2VkdWNhdGlvbl9kYXRhKGxldmVsID0gImNvbGxlZ2UtdW5pdmVyc2l0eSIsCiMgICAgIHNvdXJjZSA9ICJpcGVkcyIsCiMgICAgIHRvcGljID0gImRpcmVjdG9yeSIsCiMgICAgIGZpbHRlcnMgPSBsaXN0KHllYXIgPSAyMDE5KSkKIyBkYXRhCgojIFNjb3JlY2FyZCBkYXRhIC0gMjAxOSAKc2MgPC0gcmVhZF9jc3YoJzIwMTlfQ29sbGVnZV9TY29yZWNhcmRfVmFsaWRfQWRtaXNzaW9uc19EYXRhLmNzdicpCnNjCgojIyBjaGFuZ2UgcHJvamVjdGlvbiBvZiBzYyBkYXRhCnNjIDwtIHNjICU+JQogIGRwbHlyOjptdXRhdGUodW5pX3JhbmsgPSBjYXNlX3doZW4oCiAgICBBRE1fUkFURSA8IDAuMDUgfiAnZWxpdGUnLAogICAgQURNX1JBVEUgPCAwLjIgfiAnaGlnaGx5IHNlbGVjdGl2ZScsCiAgICBBRE1fUkFURSA8IDAuMyB+ICdtb3JlIHNlbGVjdGl2ZScsCiAgICBBRE1fUkFURSA8IDAuNSB+ICdzZWxlY3RpdmUnLAogICAgQURNX1JBVEUgPCAwLjcgfiAnbGVzcyBzZWxlY3RpdmUnLAogICAgVFJVRSB+ICdub3Qgc2VsZWN0aXZlJykpICU+JSBtdXRhdGUodW5pX3JhbmsgPSBmYWN0b3IodW5pX3JhbmssIGxldmVscz1jKCdub3Qgc2VsZWN0aXZlJywgJ2xlc3Mgc2VsZWN0aXZlJywgJ3NlbGVjdGl2ZScsICdtb3JlIHNlbGVjdGl2ZScsICdoaWdobHkgc2VsZWN0aXZlJywgJ2VsaXRlJykpKQpgYGAKCiMjIFNpbXBsZSBTY2F0dGVyZ3JhbSAKCkZpcnN0IHdlIGFyZSBnb2luZyB0byB0cnkgdG8gcHJlc2VudCB0aGlzIHBhdHRlcm4gZm9yIGRpZmZlcmVudCB0aWVycyBvZiB1bml2ZXJzaXRpZXMgKGFkbWlzc2lvbiByYXRlIGFzIHdlbGwgYXMgZGVidCkKYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQojIFJlbW92ZSBQcml2YWN5U3VwcHJlc3NlZCBSZWNvcmRzIGFuZCB0cmFuc2Zvcm0gRGVidCBNZWRpYW4gaW50byBhIG51bWVyaWMgdmFsdWUgLSB3ZSBjYW4gYWxzbyBkbyB0aGlzIG9uIHRoZSBtYWluIHNjIGRmCnNjJERFQlRfTUROW2lzLm5hKHNjJERFQlRfTUROKV0gPC0gMDsKCm0gPC0gc2MgJT4lIHN1YnNldChERUJUX01ETiAhPSdQcml2YWN5U3VwcHJlc3NlZCcpICU+JSB0cmFuc2Zvcm0oREVCVF9NRE4gPSBhcy5udW1lcmljKERFQlRfTUROKSkgJT4lIAogICAgICAgICAgICAgIGdncGxvdCguLCBhZXMoeD1BRE1fUkFURSwgeT1ERUJUX01ETixjb2xvcj11bmlfcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKGNvbG9yPScjRUE0Rjg4Jywgc2UgPSBGQUxTRSkgKwogIHRoZW1lX2lwc3VtKGJhc2Vfc2l6ZSA9IDEwLCBheGlzX3RpdGxlX3NpemUgPSAxMiwgcGxvdF90aXRsZV9zaXplPTE0KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKCkrCiAgdGhlbWUoCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3lfZGlzY3JldGUobGltaXRzPWMoMCwxMDAwMCwyMDAwMCwzMDAwMCksIGxhYmVscz1jKCcwJywnMTAnLCcyMCcsJzMwJykpICsKICBsYWJzKHg9J0FkbWlzc2lvbnMgUmF0ZScsIHk9J01lZGlhbiBMb2FuIEFtb3VudCBwZXIgU3R1ZGVudFxuKHRob3VzYW5kcyknLCAKICAgICAgIHRpdGxlPSdTdHVkZW50IERlYnQgYW5kIEFkbWlzc2lvbnMgUmF0ZScsCiAgICAgICBjb2xvcj0nU2VsZWN0aXZpdHknKQptCmBgYApgYGB7ciwgZWNobz1UUlVFLCBldmFsPVRSVUV9CiMgQ3JlYXRlIERhdGEgVGFibGUgKFN1bW1hcml6ZWQpIGZvciAKbGlicmFyeSgnc2NhbGVzJykKCnNjX2R0IDwtIHNjICU+JSBzdWJzZXQoREVCVF9NRE4gIT0nUHJpdmFjeVN1cHByZXNzZWQnKSAlPiUgdHJhbnNmb3JtKERFQlRfTUROID0gYXMubnVtZXJpYyhERUJUX01ETikpICU+JSBncm91cF9ieSh1bmlfcmFuaykgJT4lIG11dGF0ZShgTnVtYmVyIG9mIFVuaXZlcnNpdGllc2AgPSBuKCkpICU+JSB1bmdyb3VwKCkgJT4lIG11dGF0ZShERUJUX01ETl9TVFVERU5UUyA9IERFQlRfTUROKlVHRFMpICU+JSBncm91cF9ieSh1bmlfcmFuaykgJT4lIG11dGF0ZShgTWVkaWFuIFN0dWRlbnQgTG9hbnNgID0gcGFzdGUoJyQnLHJvdW5kKHN1bShERUJUX01ETl9TVFVERU5UUywgbmEucm09VFJVRSkvc3VtKFVHRFMsIG5hLnJtPVRSVUUpLDIpKSkgJT4lIAogIG11dGF0ZShgTWluIEFjY2VwdGFuY2UgUmF0ZWAgPSBwZXJjZW50KG1pbihBRE1fUkFURSkpKSAlPiUgbXV0YXRlKGBNYXggQWNjZXB0YW5jZSBSYXRlYCA9IHBlcmNlbnQobWF4KEFETV9SQVRFKSkpICU+JSB1bmdyb3VwKCkgJT4lIAogIGdyb3VwX2J5KHVuaV9yYW5rLGBNZWRpYW4gU3R1ZGVudCBMb2Fuc2AsYE51bWJlciBvZiBVbml2ZXJzaXRpZXNgLGBNaW4gQWNjZXB0YW5jZSBSYXRlYCxgTWF4IEFjY2VwdGFuY2UgUmF0ZWApICU+JSAKICBzdW1tYXJpemUoKQoKaW5zdGFsbC5wYWNrYWdlcygnRFQnKQpsaWJyYXJ5KERUKQp0YWJsZSA8LSBkYXRhdGFibGUoc2NfZHQsc3R5bGUgPSAiZGVmYXVsdCIsZmlsdGVyID0gJ3RvcCcsICBjYXB0aW9uID0gJ1VuaXZlcnNpdGllcyBhbmQgU2VsZWN0aXZpdHknKQp0YWJsZQoKYGBgCgoKIyMgU2NhdHRlcmdyYW0gYXMgVmlvbGluIFBsb3QKYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQptIDwtIHNjICU+JSBzdWJzZXQoREVCVF9NRE4gIT0nUHJpdmFjeVN1cHByZXNzZWQnKSAlPiUgdHJhbnNmb3JtKERFQlRfTUROID0gYXMubnVtZXJpYyhERUJUX01ETikpICU+JSAKICBnZ3Bsb3QoLiwgYWVzKHg9dW5pX3JhbmssIHk9REVCVF9NRE4pKSArCiAgZ2VvbV92aW9saW4oYWVzKGZpbGw9dW5pX3JhbmssY29sb3I9dW5pX3JhbmspKSArCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4yKSsKICB0aGVtZV9pcHN1bShiYXNlX3NpemUgPSAxMCwgYXhpc190aXRsZV9zaXplID0gMTIsIHBsb3RfdGl0bGVfc2l6ZT0xNCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKCkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzX2QoKSArCiAgdGhlbWUoCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3lfZGlzY3JldGUobGltaXRzPWMoMCwxMDAwMCwyMDAwMCwzMDAwMCksIGxhYmVscz1jKCcwJywnMTAnLCcyMCcsJzMwJykpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCdub3RcbnNlbGVjdGl2ZVxuKD43MCUpJywnbGVzc1xuc2VsZWN0aXZlXG4oNTAlLTcwJSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGVjdGl2ZVxuKDMwJS01MCUpJywnbW9yZVxuc2VsZWN0aXZlXG4oMjAlLTMwJSknLCdoaWdobHlcbnNlbGVjdGl2ZVxuKDUlLTIwJSknLCdlbGl0ZVxuKDw1JSknKSkgKwoKICBsYWJzKHg9J1NlbGVjdGl2aXR5XG4oYWRtaXNzaW9uIHJhdGUgdGhyZXNob2xkcyknLCB5PSdNZWRpYW4gTG9hbiBBbW91bnQgcGVyIFN0dWRlbnRcbih0aG91c2FuZHMpJywgCiAgICAgICB0aXRsZT0nU2VsZWN0aXZlIFNjaG9vbHMgYW5kIFN0dWRlbnQgRGVidCcsCiAgICAgICBjb2xvcj0nJyxmaWxsPScnKQptCmBgYAoKYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQppcGVkczE1IDwtIGdldF9lZHVjYXRpb25fZGF0YShsZXZlbCA9ICJjb2xsZWdlLXVuaXZlcnNpdHkiLAogICAgc291cmNlID0gImlwZWRzIiwKICAgIHRvcGljID0gImdyYWQtcmF0ZXMtcGVsbCIsCiAgICBmaWx0ZXJzID0gbGlzdCh5ZWFyID0gMjAxNSkpCmlwZWRzMTUKYGBgCgoKIyMgU3R1ZGVudCBEZWJ0IG92ZXIgVGltZQoKYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQojUHJvY2VzcyB0aGUgZGF0YSAKc2NfdGltZSA8LSByZWFkX2NzdignMjAxMF8yMDE5X3N0dWRlbnRfZGVidC5jc3YnKSAKCnNjX3RpbWU8LSBzY190aW1lICU+JSBzdWJzZXQoREVCVF9NRE4gIT0nUHJpdmFjeVN1cHByZXNzZWQnKSAlPiUgCiAgdHJhbnNmb3JtKERFQlRfTUROID0gYXMubnVtZXJpYyhERUJUX01ETikpICU+JSAKICBkcGx5cjo6bXV0YXRlKERFQlRfTUROID0gaWZlbHNlKGlzLm5hKERFQlRfTUROKSwgMCwgREVCVF9NRE4pKQoKYGBgCgoKYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQojUHJvY2VzcyB0aGUgZGF0YSAKc2NfdGltZSA8LSByZWFkX2NzdignMjAwOV8yMDE5X3N0dWRlbnRfZGVidC5jc3YnKSAKCnNjX3RpbWU8LSBzY190aW1lICU+JSBzdWJzZXQoREVCVF9NRE4gIT0nUHJpdmFjeVN1cHByZXNzZWQnKSAlPiUgCiAgdHJhbnNmb3JtKERFQlRfTUROID0gYXMubnVtZXJpYyhERUJUX01ETikpICU+JSAKICBkcGx5cjo6bXV0YXRlKERFQlRfTUROID0gaWZlbHNlKGlzLm5hKERFQlRfTUROKSwgMCwgREVCVF9NRE4pKSAlPiUgCiAgbXV0YXRlKERFQlRfTUROX1NUVURFTlQgPSBERUJUX01ETipVR0RTKQpzY190aW1lCnN1bShzY190aW1lJFVHRFMsbmEucm09VFJVRSkKYGBgCgpgYGB7ciwgZWNobz1UUlVFLCBldmFsPVRSVUV9CiMgQ1BJIEluZmxhdGlvbiBSYXRlcyAtIEdvdCBBdmVyYWdlIFllYXJseSBJbmZsYXRpb24gUmF0ZSBmb3IgU2NhbGluZyBmb3IgU3R1ZGVudCBEZWJ0IAppbnN0YWxsLnBhY2thZ2VzKCdxdWFudG1vZCcpCmxpYnJhcnkocXVhbnRtb2QpCmdldFN5bWJvbHMoIkNQSUFVQ1NMIiwgc3JjPSdGUkVEJykKYXZnLmNwaSA8LSBhcHBseS55ZWFybHkoQ1BJQVVDU0wsIG1lYW4pCmNmIDwtIGFzLmRhdGEuZnJhbWUoYXZnLmNwaS9hcy5udW1lcmljKGF2Zy5jcGlbJzIwMDknXSkpIApjZiRZZWFyX0VuZGluZyA8LSBmb3JtYXQoYXMuRGF0ZShyb3cubmFtZXMoY2YpLCBmb3JtYXQ9IiVZLSVtLSVkIiksIiVZIikKCiMgTWVyZ2VkIGZvciBJbmZsYXRpb24gCnNjX3RpbWVfZGYgPC0gc2NfdGltZSAlPiUgZ3JvdXBfYnkoYFllYXJfRW5kaW5nYCkgJT4lIG11dGF0ZShgQXZlcmFnZSBBbm51YWwgU3R1ZGVudCBEZWJ0IC0gTmF0aW9uYWxgID0gc3VtKERFQlRfTUROX1NUVURFTlQsbmEucm09VFJVRSkvc3VtKFVHRFMsbmEucm09VFJVRSkpICU+JSB1bmdyb3VwKCkgJT4lIAogIGRwbHlyOjptdXRhdGUodW5pX3JhbmsgPSBjYXNlX3doZW4oCiAgICBBRE1fUkFURSA8IDAuMDUgfiAnZWxpdGUnLAogICAgQURNX1JBVEUgPCAwLjIgfiAnaGlnaGx5IHNlbGVjdGl2ZScsCiAgICBBRE1fUkFURSA8IDAuMyB+ICdtb3JlIHNlbGVjdGl2ZScsCiAgICBBRE1fUkFURSA8IDAuNSB+ICdzZWxlY3RpdmUnLAogICAgQURNX1JBVEUgPCAwLjcgfiAnbGVzcyBzZWxlY3RpdmUnLAogICAgVFJVRSB+ICdub3Qgc2VsZWN0aXZlJykpICU+JQogIG11dGF0ZSh1bmlfcmFuayA9IGZhY3Rvcih1bmlfcmFuaywgbGV2ZWxzPWMoJ25vdCBzZWxlY3RpdmUnLCAnbGVzcyBzZWxlY3RpdmUnLCAnc2VsZWN0aXZlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9yZSBzZWxlY3RpdmUnLCAnaGlnaGx5IHNlbGVjdGl2ZScsICdlbGl0ZScpKSkgJT4lCiAgZ3JvdXBfYnkodW5pX3JhbmssWWVhcl9FbmRpbmcpICU+JSAKICBtdXRhdGUoYEF2ZXJhZ2UgQW5udWFsIFN0dWRlbnQgRGVidCAoYnkgU2VsZWN0aXZpdHkpYCA9IHN1bShERUJUX01ETl9TVFVERU5ULG5hLnJtPVRSVUUpL3N1bShVR0RTLG5hLnJtPVRSVUUpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBncm91cF9ieShgWWVhcl9FbmRpbmdgLGBBdmVyYWdlIEFubnVhbCBTdHVkZW50IERlYnQgKGJ5IFNlbGVjdGl2aXR5KWAsCiAgICAgICAgICAgdW5pX3JhbmssYEF2ZXJhZ2UgQW5udWFsIFN0dWRlbnQgRGVidCAtIE5hdGlvbmFsYCkgJT4lIHN1bW1hcml6ZSgpICU+JSAKICBtZXJnZShjZikgJT4lIAogIG11dGF0ZShgQWRqdXN0ZWQgQXZlcmFnZSBBbm51YWwgU3R1ZGVudCBEZWJ0YCA9IGBBdmVyYWdlIEFubnVhbCBTdHVkZW50IERlYnQgKGJ5IFNlbGVjdGl2aXR5KWAvCiAgICAgICAgICAgQ1BJQVVDU0wpICU+JSAKICBtdXRhdGUoYEFkanVzdGVkIEF2ZXJhZ2UgQW5udWFsIFN0dWRlbnQgRGVidCAtIENvbXBvc2l0ZWAgPSBgQXZlcmFnZSBBbm51YWwgU3R1ZGVudCBEZWJ0IC0gTmF0aW9uYWxgLwogICAgICAgICAgIENQSUFVQ1NMKQoKc2NfZGYgPC0gc2NfdGltZV9kZiAlPiUgZ3JvdXBfYnkoYEF2ZXJhZ2UgQW5udWFsIFN0dWRlbnQgRGVidCAtIE5hdGlvbmFsYCxgQWRqdXN0ZWQgQXZlcmFnZSBBbm51YWwgU3R1ZGVudCBEZWJ0IC0gQ29tcG9zaXRlYCxZZWFyX0VuZGluZykgJT4lIHN1bW1hcml6ZSgpICU+JSBtdXRhdGUodW5pX3Jhbms9J25hdGlvbmFsIGF2ZXJhZ2UnKSAlPiUgbXV0YXRlKGBBZGp1c3RlZCBBdmVyYWdlIEFubnVhbCBTdHVkZW50IERlYnRgPWBBZGp1c3RlZCBBdmVyYWdlIEFubnVhbCBTdHVkZW50IERlYnQgLSBDb21wb3NpdGVgKSAlPiUgZHBseXI6Om11dGF0ZShgQXZlcmFnZSBBbm51YWwgU3R1ZGVudCBEZWJ0IChieSBTZWxlY3Rpdml0eSlgID0gYEF2ZXJhZ2UgQW5udWFsIFN0dWRlbnQgRGVidCAtIE5hdGlvbmFsYCkgJT4lIG1lcmdlKGNmKSAlPiUgc2VsZWN0KFllYXJfRW5kaW5nLGBBdmVyYWdlIEFubnVhbCBTdHVkZW50IERlYnQgKGJ5IFNlbGVjdGl2aXR5KWAsIHVuaV9yYW5rLCBgQXZlcmFnZSBBbm51YWwgU3R1ZGVudCBEZWJ0IC0gTmF0aW9uYWxgLCBDUElBVUNTTCwgYEFkanVzdGVkIEF2ZXJhZ2UgQW5udWFsIFN0dWRlbnQgRGVidGAsYEFkanVzdGVkIEF2ZXJhZ2UgQW5udWFsIFN0dWRlbnQgRGVidCAtIENvbXBvc2l0ZWApCnNjX3RpbWVfZGYgPC0gc2NfdGltZV9kZiAlPiUgcmJpbmQoc2NfZGYpICU+JSBtdXRhdGUodW5pX3JhbmsgPSBmYWN0b3IodW5pX3JhbmssIGxldmVscz1jKCduYXRpb25hbCBhdmVyYWdlJywnbm90IHNlbGVjdGl2ZScsICdsZXNzIHNlbGVjdGl2ZScsICdzZWxlY3RpdmUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb3JlIHNlbGVjdGl2ZScsICdoaWdobHkgc2VsZWN0aXZlJywgJ2VsaXRlJykpKQpzY190aW1lX2RmCgpwIDwtIHNjX3RpbWVfZGYgJT4lIAogIGdncGxvdCguLGFlcyh4PVllYXJfRW5kaW5nLHk9YEFkanVzdGVkIEF2ZXJhZ2UgQW5udWFsIFN0dWRlbnQgRGVidGAsIGNvbG9yPXVuaV9yYW5rKSkgKyAKICBnZW9tX3BvaW50KCkgKyBnZW9tX2xpbmUoKSArIAogIHRoZW1lX2lwc3VtKGJhc2Vfc2l6ZSA9IDEwLCBheGlzX3RpdGxlX3NpemUgPSAxMiwgcGxvdF90aXRsZV9zaXplPTE0KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKCkrCiAgdGhlbWUoCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSByb3VuZChzZXEobWluKHNjX3RpbWUkWWVhcl9FbmRpbmcpLCBtYXgoc2NfdGltZSRZZWFyX0VuZGluZyksIGJ5ID0gMiksMSkpICsKICBsYWJzKHg9JycsIHk9J01lZGlhbiBMb2FuIEFtb3VudCBwZXIgU3R1ZGVudFxuKHRob3VzYW5kcyknLCAKICAgICAgIHRpdGxlPSdTdHVkZW50IERlYnQgSGFzIEJlZW4gUmlzaW5nIE92ZXIgVGhlIFllYXJzJywKICAgICAgIGNvbG9yPScnLGZpbGw9JycpCmdncGxvdGx5KHApCgpmaWcxIDwtIHNjX3RpbWVfZGYgJT4lIHBsb3RfbHkoeCA9IH5ZZWFyX0VuZGluZywgeSA9IH5gQWRqdXN0ZWQgQXZlcmFnZSBBbm51YWwgU3R1ZGVudCBEZWJ0YCwgdHlwZSA9ICdzY2F0dGVyJywKICBjb2xvciA9IH51bmlfcmFuaywgYWxwaGE9MC44LCBob3ZlcnRlbXBsYXRlID0gJ0F2ZXJhZ2UgRGVidC9TdHVkZW50IChVU0QpOiAle3l9JSA8ZXh0cmE+PC9leHRyYT4nKSAlPiUgYWRkX2xpbmVzKHggPSB+WWVhcl9FbmRpbmcseSA9IH5gQWRqdXN0ZWQgQXZlcmFnZSBBbm51YWwgU3R1ZGVudCBEZWJ0YCxsaW5lID0gbGlzdChjb2xvciA9fnVuaV9yYW5rKSkgCj9saW5ldHlwZQoKZmlnMQoKCmBgYAoKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRSB9CiMgQWRkaXRpb25zIG9mIFN0YXRlcyBkZiBmcm9tIFRpZ3JpcyBGaWxlIApsaWJyYXJ5KHRpZ3JpcykKc3RhdGVzIDwtIHN0YXRlcyhjYiA9IFRSVUUpCnNjX3RpbWUKc2NfdGltZV95ZWFyIDwtIHNjX3RpbWUgJT4lIGdyb3VwX2J5KCkKCiMgU3RhdGVzIApzdGF0ZXNfMTAgPC0gc3RhdGVzICU+JSAKICBpbm5lcl9qb2luKHNjX3RpbWUsIGJ5PWMoU1RVU1BTPSdTVEFCQlInKSkgCgoKcG9wdXAxIDwtIHBhc3RlKCJTdGF0ZToiLHN0YXRlcyROQU1FLCI8YnIvPiIsCiAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb246IixzdGF0ZXMkcG9wdWxhdGlvbiwiPGJyLz4iLAogICAgICAgICAgICAgICAgICJTdWNjZXNzZnVsIFByb2plY3RzIC8gUG9wdWxhdGlvbjoiLHN0YXRlcyRzY2FsZWRfc3VjY2VzcywiPGJyLz4iKQoKI3VzZWQgJ3N1Y2Nlc3MnIG1lYXN1cmVzLiAKbSA8LSBsZWFmbGV0KHN0YXRlcykgJT4lIGFkZFByb3ZpZGVyVGlsZXMoIkNhcnRvREIuUG9zaXRyb24iKSAlPiUKICBhZGRQb2x5Z29ucyhmaWxsQ29sb3IgPSB+cGFsKHN0YXRlcyRzY2FsZWRfc3VjY2VzcyksCiAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgIHdlaWdodCA9IDAuNSwKICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNywgIAogICAgICAgICAgICAgIGhpZ2hsaWdodCA9IGhpZ2hsaWdodE9wdGlvbnMoCiAgICAgICAgICAgICAgICB3ZWlnaHQgPSA1LAogICAgICAgICAgICAgICAgY29sb3IgPSAiIzY2NiIsCiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNywKICAgICAgICAgICAgICAgIGJyaW5nVG9Gcm9udCA9IFRSVUUpLAogICAgICAgICAgICAgICAgcG9wdXA9cG9wdXAxKSAlPiUKICBhZGRMZWdlbmQocG9zaXRpb24gPSAiYm90dG9tbGVmdCIscGFsID0gcGFsLCB2YWx1ZXMgPSBjKG1pbihzdGF0ZXMkc2NhbGVkX3N1Y2Nlc3MpLG1heChzdGF0ZXMkc2NhbGVkX3N1Y2Nlc3MpKSx0aXRsZSA9ICJTdWNjZXNzZnVsIEtpY2tzdGFydGVyIFByb2plY3RzXG4gKHNjYWxlZCBieSBzdGF0ZSkiKSAlPiUgCiAgc2V0VmlldygtOTguNTc5NSwgMzkuODI4Miwgem9vbT0zKQoKCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkobGVhZmxldCkKCiMgRmFrZSBkYXRhCmRmIDwtIGRhdGEuZnJhbWUobG5nID0gYygtNSwgLTUsIC01LCAtNSwgLTE1LCAtMTUsIC0xMCksCiAgICAgICAgICAgICAgIGxhdCA9IGMoOCwgOCwgOCwgOCwgMzMsIDMzLCAyMCksCiAgICAgICAgICAgICAgIHllYXIgPSBjKDIwMTgsIDIwMTgsIDIwMTgsIDIwMTcsIDIwMTcsIDIwMTcsIDIwMTYpLAogICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgp1aSA8LSBib290c3RyYXBQYWdlKAp0YWdzJHN0eWxlKHR5cGUgPSAidGV4dC9jc3MiLCAiaHRtbCwgYm9keSB7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0iKSwKbGVhZmxldE91dHB1dCgibWFwIiwgd2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICIxMDAlIiksCmFic29sdXRlUGFuZWwodG9wID0gMTAsIHJpZ2h0ID0gMTAsCiAgICAgICAgICAgICAgc3R5bGU9InotaW5kZXg6NTAwOyIsICMgbGVnZW5kIG92ZXIgbXkgbWFwIChtYXAgeiA9IDQwMCkKICAgICAgICAgICAgICB0YWdzJGgzKCJtYXAiKSwgCiAgICAgICAgICAgICAgc2xpZGVySW5wdXQoInBlcmlvZGUiLCAiQ2hyb25vbG9neSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKGRmJHllYXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1heChkZiR5ZWFyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJhbmdlKGRmJHllYXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIiCiAgICAgICAgICAgICAgKQopCikKCnNlcnZlciA8LSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0LCBzZXNzaW9uKSB7CgojIHJlYWN0aXZlIGZpbHRlcmluZyBkYXRhIGZyb20gVUkKCnJlYWN0aXZlX2RhdGFfY2hyb25vIDwtIHJlYWN0aXZlKHsKICBkZiAlPiUKICAgIGZpbHRlcih5ZWFyID49IGlucHV0JHBlcmlvZGVbMV0gJiB5ZWFyIDw9IGlucHV0JHBlcmlvZGVbMl0pCn0pCgoKIyBzdGF0aWMgYmFja3JvdW5kIG1hcApvdXRwdXQkbWFwIDwtIHJlbmRlckxlYWZsZXQoewogIGxlYWZsZXQoZGYpICU+JQogICAgYWRkVGlsZXMoKSAlPiUKICAgIGZpdEJvdW5kcyh+bWluKGxuZyksIH5taW4obGF0KSwgfm1heChsbmcpLCB+bWF4KGxhdCkpCn0pICAKCiMgcmVhY3RpdmUgY2lyY2xlcyBtYXAKb2JzZXJ2ZSh7CiAgbGVhZmxldFByb3h5KCJtYXAiLCBkYXRhID0gcmVhY3RpdmVfZGF0YV9jaHJvbm8oKSkgJT4lCiAgICBjbGVhclNoYXBlcygpICU+JQogICAgYWRkTWFya2Vycyhsbmc9fmxuZywKICAgICAgICAgICAgICAgbGF0PX5sYXQsCiAgICAgICAgICAgICAgIGxheWVySWQgPSB+aWQpICMgQXNzaWduaW5nIGRmIGlkIHRvIGxheWVyaWQKfSkKfQoKc2hpbnlBcHAodWksIHNlcnZlcikKCmBgYAoKCgo=